﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data;
using System.Data.SqlClient;
using System.Web.Configuration;

namespace RealtorsPortal.Data_Access_Layer
{
    public class DataAccessHelper
    {
        #region 1. Khai báo các thành viên dữ liệu
        SqlConnection conn;
        SqlCommand cmd;
        #endregion

        #region 2. Các phương thức khởi tạo
        public DataAccessHelper()
        {
            conn = new SqlConnection(WebConfigurationManager.ConnectionStrings["myconnection"].ConnectionString);

        }
        #endregion

        #region 3. Các phương thức thao tác với CSDL

        /// <summary>
        /// Phương thức mở kết nối tới CSDL
        /// </summary>
        public void Open()
        {
            if (conn.State == System.Data.ConnectionState.Closed)
                conn.Open();
        }

        /// <summary>
        /// Phương thức ngắt kết nối với CSDL
        /// </summary>
        public void Close()
        {
            if (conn.State == System.Data.ConnectionState.Open)
                conn.Close();
        }

        /// <summary>
        /// Phương thức lấy về một giá trị từ mệnh đề SELECT
        /// </summary>
        /// <param name="query">Câu lệnh SELECT</param>
        /// <returns>Một đối tượng</returns>
        public object GetValue(string query)
        {
            Open();
            cmd = new SqlCommand(query, conn);
            object o = cmd.ExecuteScalar();
            Close();
            return o;
        }

        /// <summary>
        /// Author: Hinsky Huy
        /// Get dataset
        /// </summary>
        /// <param name="queryStr">Chuỗi truy vấn</param>
        /// <returns>dataset</returns>
        public DataSet GetDataSet(string queryStr)
        {
            SqlDataAdapter adp = new SqlDataAdapter(queryStr, conn);
            DataSet ds = new DataSet();
            adp.Fill(ds);
            this.Close();
            return ds;
        }

        public DataTable GetData(string stroreProcedure, List<SqlParameter> param)
        {
            DataTable dt = new DataTable();
            cmd = new SqlCommand();
            if (conn.State == ConnectionState.Closed)
            {
                conn.Open();
            }
            //cmd.Connection = conn;
            cmd = conn.CreateCommand();
            
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.CommandText = stroreProcedure;
            foreach (SqlParameter p in param)
            {
                cmd.Parameters.Add(p);
            }
            cmd.ExecuteNonQuery();
            SqlDataAdapter da = new SqlDataAdapter(cmd);
            da.Fill(dt);
            conn.Close();
            return dt;
        } 

        public DataTable GetDataTable(string select)
        {
            DataTable dt = new DataTable();
            try {
                Open();
                SqlCommand cmd = new SqlCommand(select, conn);
                cmd.CommandType = CommandType.StoredProcedure;
                SqlDataAdapter da = new SqlDataAdapter(select, conn);
                da.Fill(dt);
                conn.Close();
            }catch{
                conn.Close();
            }
            return dt;
        }

        public int ExecuteNonQuery(string query)
        {
            Open();
            cmd = new SqlCommand(query, conn);
            int ret = cmd.ExecuteNonQuery();
            Close();
            return ret;
        }

        /// <summary>
        /// Author: Hinsky Huy
        /// Dùng để excute 1 stored procedure trên database
        /// </summary>
        /// <param name="storedName">tên stored procedure trên database</param>
        /// <param name="param"> 1 collection các SqlParametor</param>
        /// <returns>Trả về số bản ghi đã thao tác</returns>
        public int ExcuteStoredNonQuery(string storedName, List<SqlParameter> param)
        {
            if (conn.State == ConnectionState.Closed)
            {
                conn.Open();
            }
            cmd = conn.CreateCommand();
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.CommandText = storedName;
            foreach (SqlParameter p in param)
            {
                cmd.Parameters.Add(p);
            }
            int ret = cmd.ExecuteNonQuery();
            this.Close();
            conn.Close();
            return ret;
        }
        
        public int GetLastID(string storeProcedure, string ColumnName)
        {
            DataTable dt = new DataTable();
            dt = GetDataTable(storeProcedure);
            if (dt.Rows.Count == 0)
            {
                return 0;
            }
            return int.Parse(dt.Rows[0][ColumnName].ToString());
        }

        #endregion
    }
}